【Linux】基于Mplayer开源多媒体库的音视频播放器

您所在的位置:网站首页 linux 播放系统 【Linux】基于Mplayer开源多媒体库的音视频播放器

【Linux】基于Mplayer开源多媒体库的音视频播放器

2023-07-18 06:31| 来源: 网络整理| 查看: 265

文章目录 1 项目概况2 项目需求3 搭建环境4 技术描述5 概要设计6 条件准备和主界面构架7 点名系统:8 相册:9 视频:10 音乐:11 项目总结

1 项目概况

本次项目是基于Linux环境的交叉编译arm-linux-gcc,在GEC6818arm开发板上运行,创建多条链表分别存储遍历到当前目录下子目录中的音乐、视频和图片文件名,通过读取触摸设备文件的点击事件进行判断,选择对相册切换以及音视频的快进/快退、上下首切换、音量调节、进度条调节等功能

2 项目需求

(1)制作播放器 (基本要求)

利用触摸屏实现音量的调节 快进快退的调节 进度条(可以通过进度条控制视频的播放位置)

控制功能: //调用system命令 播放视频 system(“mplayer -slave -quiet -input file=/pipe -geometry 0:0 -zoom -x 800 -y 380 mn.avi”);

//打开指定管道文件 fd=open(/pipe)

//写入控制命令到管道中 write(fd, "pause\n",strlen("pause\n")); --------------------------- system("echo pause > /pipe"); //如何获取mplayer输出的数据 dup2() ->文件重定向

(2)预览效果 (强化)

获取系统中的所有视频文件,把他的预览图显示到桌面中, (把预览图与视频路径关联起来,到链表中), 提供用户选择 //获取一帧图像的命令 mplayer -ss 84 -noframedrop -nosound -vo jpeg -frames 1 xx.rmvb -ss 获取那一秒 预览图: 1.遍历目录搜索视频文件 (.avi (不要太大,因为硬盘只有500M)) 2.找到视频文件后 调用mplayer -ss 84 -noframedrop -nosound -vo jpeg -frames 1 xx.rmvb 命令生成图片 (直接生成一张100*100的小图命令如下:) mplayer -zoom -x 100 -y 100 -ss 99 -noframedrop -nosound -vo jpeg -frames 1 Faded3.avi 3.把该图片显示到 屏幕中 (要对图片进行缩放 100 100) //多进程 ,多线程 , 进程间的管道通信, 注意:保护共享资源 3 搭建环境

开发环境: Linux

开发工具: arm-linux-gcc、Notepad++

其他工具: mplayer开源多媒体库、jpeglib库、font库

描述: 通过开源代码编译器notepad++编写代码,利用arm-linux-gcc交叉编译,再通过LINUX平台的SSH服务器将编译生成的程序文件传输到开发板中,最后执行。

移植mplayer开源多媒体库: MPlayer是一款开源的多媒体播放器,以GNU通用公共许可证发布。此款软件可在各主流作业系统使用,例如Linux和其他类Unix作业系统、微软的视窗系统及苹果电脑的Mac OS X系统。MPlayer是建基于命令行界面,在各作业系统可选择安装不同的图形界面。

因为linux下都是命令行的操作方式,所以对mplayer的各种操作都是用命令来实现的,这次主要用的是它的slave工作方式(在slave模式下,MPlayer为后台运行其他程序,不再截获键盘事件, MPlayer会从标准输入读一个换行符(\n)分隔开的命令)。 移植Mplayer

Mplayer部分指令:

Mplayer主要指令

Mplayer部分程序代码指令:

write(fd,"volume +5\n",strlen("volume +5\n"));//加声音 write(fd,"volume -5\n",strlen("volume -5\n"));//减声音 write(fd,"seek -5\n",strlen("seek -5\n"));//快退。 write(fd,"seek +5\n",strlen("seek -5\n"));//快进。 write(fd,"pause\n",strlen("pause\n"));//暂停播放 write(fd,"seek 100 1\n",strlen("seek 100 1\n"));//停止播放 write(fd,"seek 100 1\n",strlen("seek 100 1\n"));//进度跳转

封装JPEGLIB库和font库: 通过移植封装jpeglib库和font库,可以使6816开发板显示出JPEG图片和自定义字体。 图库和字库的搭建

4 技术描述

基本

C语言文件IO(遍历目录,读写文件)链表(创建多个双向循环链表存取歌曲、图片、电影名)

核心

系统编程(进/线程的创建、通信)Mplayer指令的运用(重定向、音量、进度调节、暂停/播放)触摸屏(点击事件、滑屏处理)font库的使用(动态显示字体、像素点映射)jpeglib库的使用(图片显示切换) 5 概要设计

整体概要设计图如下:

项目框架

6 条件准备和主界面构架

一开始通过创建链表、遍历各模块文件夹存进节点。初始化触摸屏,显示图片… 具体效果和代码如下:

实体效果:

屏保: 屏保 主界面: 主界面 具体代码:

int main() { in_list();//创建图片/视频/音乐链表 struct double_list *p=head3; lcd_fd=open("/dev/input/event0",O_RDWR);//打开触摸屏 if(lcd_fd < 0) { perror("open ts fail:"); } show_protect(); //增加屏保 //-------------滚动条------------- pthread_t tid; pthread_create(&tid,NULL,move_move,NULL); //-------------滚动条------------- while(1) { printf("\n"); show_pohoto("xuanze.bmp");//选择功能菜单:视频or 相册or 音乐 lcd_finger(); if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0) { if(y>145 &&y480 && x235 &&y480 && x333 &&y480 && x55 &&y270 && x380 &&y0 &&x370 &&y690 &&x320 &&y300 &&xnext; char buff[66]; sprintf(buff,"/mnt/sd/project2/photo/%s",tmp->pic_name); //拼接路径 printf("\n"); show_pohoto(buff);//显示图片 while(1) { while(1) { lcd_finger(); if(xy.type == EV_KEY && xy.code == BTN_TOUCH ) { if( xy.value == 1) { xx = x; yy = y; } else { if(y>370 &&y0 && x=-30&&yyy20) //向右滑动,下一张图片 { tmp=tmp->next; if(tmp==head2) { tmp=tmp->next; } bzero(buff,sizeof(buff)); sprintf(buff,"/mnt/sd/project2/photo/%s",tmp->pic_name);//拼接路径 printf("\n"); show_pohoto(buff);//显示图片 } if(yyy>=-30&&yyyprev; } bzero(buff,sizeof(buff)); sprintf(buff,"/mnt/sd/project2/photo/%s",tmp->pic_name); printf("\n"); show_pohoto(buff); } } } 9 视频:

通过视频目录,判断触屏坐标选择相应视频,进入播放界面播放视频以及其他播放功能。 具体效果和代码如下: 实体效果: 视频目录: 视频目录 播放器: 播放器 具体代码:

int video_contents(struct double_list *head)//视频目录 { struct double_list *tmp = NULL; while(1) { printf("\n"); show_pohoto("shipingmulu.bmp"); show_jpg("1giao.jpg",150,60); show_jpg("2xzq.jpg",350,60); show_jpg("3cxk.jpg",550,60); show_jpg("4nixx.jpg",150,260); show_jpg("5xhpp.jpg",350,260); show_jpg("6superme.jpg",550,260); while(1) { lcd_finger(); if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0) { printf("目录中:x=%d,y=%d\n",x,y); if(y>60 &&y150 && x60 &&y350 && x380 &&y0 && xpic_name); strtok(new_name,"."); show_name(new_name);//显示视频名字 drw_sound(5); char buff[100];//接收拼接好的播放视频指令 int fd = open("/pipe1",O_RDWR);//打开通信的管道文件 if(fd < 0) { perror("fail:"); exit(0); //退出进程 } dup2(fd,1);//重定向标准输出设备描述符 //=======刷新进度条======= pthread_t tid; pthread_create(&tid,NULL,func,NULL); pthread_detach(tid); //=======进行触摸屏操作======== pthread_t tid1; pthread_create(&tid1,NULL,finger,NULL);//(快进/后退、音量调节、暂停/播放、静音.....) pthread_detach(tid1); sprintf(buff,"mplayer -slave -quiet -input file=/pipe -geometry 0:0 -zoom -x 750 -y 410 /mnt/sd/project2/shiping/%s",tmp->pic_name); system(buff); //执行播放命令 exit(0); } wait(NULL); } 10 音乐:

实现音乐播放器的功能:上下首、播放/暂停、音量调节、歌曲名字、后台播放。 具体效果和代码如下: 实体效果: 音乐播放器 具体代码:

struct double_list* show_music(struct double_list *p,struct double_list *head3)//播放音乐 { struct double_list *tmp=NULL; if(p==head3)//判断用户是否第一次进入音乐界面 { tmp = head3->next; } else { tmp = p; } printf("\n"); show_pohoto("music.bmp"); char name[24];//接受音乐名字 char buff[100];//接收拼接好的播放音乐指令 bzero(name,sizeof(name));//显示歌曲名字 strcpy(name,tmp->pic_name); strtok(name,"."); music_name(name); int fd = open("/pipe2",O_RDWR);//打开通信的管道文件 if(fd < 0) { perror("fail:"); exit(0); //退出进程 } while(1) { lcd_finger(); if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0) { //执行播放命令 if(y>30 &&y460 && xpic_name);//将音乐指令拼接到BUFF中,& 为后台进程播放 system(buff);//在后台开始播放 bzero(name,sizeof(name));//清空数组 strcpy(name,tmp->pic_name); strtok(name,"."); music_name(name); j++; system("echo volume 10 1 > /pipe2"); //降低初始音量 } else if(j==1) { write(fd,"seek 100 1\n",strlen("seek 100 1\n"));//停止播放 j--; } } if(y>30 &&y625 && x322 &&y560 && x322 &&y673 && x280 &&y615 && x365 &&y615 && x125 &&y625 && xnext; if(tmp==head3) { tmp=tmp->next; } bzero(buff,sizeof(buff)); sprintf(buff,"mplayer -slave -quiet -input file=/pipe2 /mnt/sd/project2/music/%s &",tmp->pic_name);//将音乐指令拼接到BUFF中 system(buff);//在后台开始播放 bzero(name,sizeof(name));//清空数组 strcpy(name,tmp->pic_name);//将音乐名字保存在数组中 strtok(name,".");//切割数组 music_name(name);//显示音乐名字 usleep(50000); system("echo volume 10 1 > /pipe2"); //降低初始音量 } if(y>125 &&y460 && xprev; if(tmp==head3) { tmp=tmp->prev; } bzero(buff,sizeof(buff)); sprintf(buff,"mplayer -slave -quiet -input file=/pipe2 /mnt/sd/project2/music/%s &",tmp->pic_name);//将音乐指令拼接到BUFF中 system(buff);//在后台开始播放 bzero(name,sizeof(name)); strcpy(name,tmp->pic_name); strtok(name,"."); music_name(name); usleep(50000); system("echo volume 10 1 > /pipe2"); //降低初始音量 } if(y>390 &&y0 && x


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3